Nakama Realtime Multiplayer
#Nakama
Match
Matchmaker APIの担当範囲は、
マッチするユーザーを pool -> match -> publish match token するところまで
match は、最後の参加者が退場するまでサーバーに残る
match を通して送信されたデータは、match の参加者に broadcast される
match は必要に応じて、永続化できる(普段はRAMの中)
Create Match
Match はプレーヤーが作成できる。
socketにmatch_createフィールドを入れて作成する。
await で取得できる Matchオブジェクトの match.match_idを使って参加できる
code: .js
var response = await socket.send({ match_create: {} });
console.log("Created match with ID:", response.match.match_id);
Join match
socketにmatch_joinフィールドを指定する。
match_id を指定して参加できる。
↑のように作成したレスポンスをシェアする代わりに、matchmakerでマッチしたときに取得できる
Matchedオブジェクトでも代用できる。
code: .js
var id = "<matchid>";
var match = await socket.send({ match_join: { match_id: id } });
var connectedOpponents = match.presences.filter((presence) => {
// Remove your own user from list.
return presence.user_id != match.self.user_id;
});
connectedOpponents.forEach((opponent) => {
console.log("User id %o, username %o.", opponent.user_id, opponent.username);
});
List opponent
opponent = 相手
code: .js
var connectedOpponents = [];
socket.onmatchpresence = (presences) => {
// Remove all users who left.
connectedOpponents = connectedOpponents.filter(function(co) {
var stillConnectedOpponent = true;
presences.leaves.forEach((leftOpponent) => {
if (leftOpponent.user_id == co.user_id) {
stillConnectedOpponent = false;
}
});
return stillConnectedOpponent;
});
// Add all users who joined.
connectedOpponents = connectedOpponents.concat(presences.joins);
};
onmatchpresenceなど、プレーヤーがマッチに参加/離脱したときに通知が来る
precenseのリストを引数に取る。
それを使ってユーザーのリストを更新する。
Send data messages
オンラインプレイのゲームプレイ部分に深く関わる。
data を含むJSONを送る。
code: .js
var id = "<matchid>";
var opCode = 1;
var data = { "move": {"dir": "left", "steps": 4} };
socket.send({ match_data_send: { match_id: id, op_code: opCode, data: data } });
socket に match_data_send メッセージを送る
また、op_codeも含む。
これはゲーム内の特定のユーザーアクションをコマンドとして定義するために使用できる。
match_id
op_code
data
data
#ProtocolBuffers
#FlatBuffers
基本はJSON
ただし、match 中に何回もやり取りするデータなので、なるべく小さい形式にしたほうがおすすめ。
Recieve data messages
コールバックを socket の on_match_dataに登録する
match 開始前に登録しておく必要あり
result.
op_code
data
の2つを見て、コマンドとデータで受信結果をゲームに反映する
code: .js
socket.onmatchdata = (result) => {
var content = result.data;
switch (result.op_code) {
case 101:
console.log("A custom opcode.");
break;
default:
console.log("User %o sent %o", result.presence.user_id, content);
}
};
リアルタイムで何度も送られてくるやつ
Leave a match
いつでも退室できる。
退室しても match_idを覚えていれば再参加できる
全員抜けるとその match_idは無効になる
code:.js
var id = "<matchid>";
socket.send({ match_leave: {match_id: id}});